package juc;

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * 推荐创建线程池方案  ThreadPoolTaskExecutor
 * Executors 打开源码，可以看到  Executors 最终创建的是 ThreadPoolTaskExecutor
 *  * newSingleThreadExecutor()：  使用无界队列作为线程池的工作队列会对线程池带来的影响与 FixedThreadPool 相同。说简单点，就是可能会导致 OOM
 *  * newCachedThreadPool()： 如果主线程提交任务的速度高于 maximumPool 中线程处理任务的速度时，CachedThreadPool 会不断创建新的线程。极端情况下，这样会导致耗尽 cpu 和内存资源。
 *  * newFixedThreadPool(int nThreads)： 使用无界队列作为线程池的工作队列会对线程池带来的影响与 FixedThreadPool 相同。说简单点，就是可能会导致 OOM
 *  * newSingleThreadScheduledExecutor()：
 *  * newScheduledThreadPool(int corePoolSize)：  在给定的延迟后运行任务或者定期执行任务
 *  * newWorkStealingPool(int parallelism)：
 *  * ThreadPoolExecutor()：
 */
public class PoolExecutorUtil {
    /**
     * 最大允许提交1W个任务
     */
    private static final int MAX_QUEUE_SIZE = 10000;

    /**
     * 注册线程池.
     */
    @Bean("testThreadPool")
    public ThreadPoolTaskExecutor testThreadPool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        int core = Runtime.getRuntime().availableProcessors();  // 根据CPU核数动态设置
        executor.setCorePoolSize(core);           // 常驻核心线程数
        executor.setMaxPoolSize(core * 2);      // 最大线程数（突发流量扩容）
        executor.setQueueCapacity(MAX_QUEUE_SIZE);  // 无界队列（关键配置）
        executor.setThreadNamePrefix("reportpool-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        executor.setWaitForTasksToCompleteOnShutdown(true);  // 关闭时等待任务完成
        executor.initialize();
        return executor;
    }

    //使用
    /*@Autowired
    private ThreadPoolTaskExecutor testThreadPool;*/
}
